import socket
import re
import os
import time
import threading

"模块文件，发送指令，从而实现启动服务器端的exe文件或bat文件"

# 读取serverip.txt文件，返回一个列表，每个元素的格式：ip:port
def get_server_lists():
    ip_lists = []
    rfiles = open('serverip.txt','r')
    rs = rfiles.readlines()
    for s in rs:
        s1 = s.replace('\n','')
        if not s1.startswith('#'):
            ip_lists.append(s1)
    return ip_lists

# 建立socket会话，收发数据
def tcp_socket_client(tcpsocket,ip,port,commandpath):
    try:
        tcpsocket.connect((ip,port))
        #输入需要执行的选择，发送给服务端
        tcpsocket.send('5'.encode('utf-8'))

        # 接收服务器返回的消息
        rec_data = tcpsocket.recv(1024)

        #发送命令给服务端
        tcpsocket.send(commandpath.encode('utf-8'))
        
        #接受服务端返回的内容
        recv_content = tcpsocket.recv(1024*1024)
        print('%s:返回内容：\n'%ip + recv_content.decode('gbk'))

        tcpsocket.close()
    except:
        print('%s:连接失败'%ip)

# 主函数，模块文件入口
def main():
    print('输入服务器端bat或exe文件的路径，例如:D:\\tdx1\\f10.bat,切记路径不要用中文,否则执行会失败！！！')
    commandpath = input()

    # 多线程，将所有的线程放在列表中
    th_lists = []
    for s in get_server_lists():
        ip = re.split(':',s)[0]
        port = int(re.split(':',s)[1])

        try:
            tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            #调用功能函数
            #tcp_socket_client(tcp_socket,ip,port,commandpath)
            th = threading.Thread(target=tcp_socket_client,args=(tcp_socket,ip,port,commandpath))
            th_lists.append(th)            
        except:
            print('%s:指令发送失败,socket将关闭'%ip)
            tcp_socket.close()
    
    for t in th_lists:
        t.start()
        time.sleep(0.5)
    
    for t in th_lists:
        t.join()
    